#include <iostream>
using std::cout;
using std::endl;
//根据raii的特征、特性：写出raii的代码
//1.构造函数中托管资源
//2.析构函数中释放资源
//3.不允许复制或者赋值操作
//4.提供若干操作资源的方法
template <class T>
class RAII{
public:
    RAII(T * data)
    :_data(data)
    {

    }
    ~RAII(){
        if(_data){
            delete _data;
            _data = nullptr;
        }
    }
    RAII(const RAII & rhs) = delete;
    RAII & operator=(const RAII & rhs) = delete;

    //和智能指针里面的get函数同样的原理
    T * get() const {
        return _data;
    }

    //和智能指针里面的箭头和解引用完全等价的
    T * operator->(){
        return _data;
    }
    T & operator*(){
        return *_data;
    }


private:
    T * _data;
};

class Point{
public:
    Point(int x, int y)
    :_x(x)
    ,_y(y)
    {

    }

    void print(){
        cout << "(" << _x << "," << _y << ")" << endl;
    }

private:
    int _x;
    int _y;
};

void test(){
    //new但是却没有调用delete，也不会有内存泄漏
    //raii的所有的操作和Point指针的所有的操作是一模一样的
    //像一个透明层一样，智能指针的雏形
    RAII<Point> raii(new Point(1, 2));
    raii->print();
    raii.get()->print();
    (*raii).print();
}

int main()
{
    test();
    return 0;
}

